---------------------------------------------------
-- 开服有礼
---------------------------------------------------

local Util = require("common.Util")
local Lang = require("common.Lang")
local Broadcast = require("broadcast.Broadcast")
local OpenAct = require("present.OpenAct")
local PresentExcel = require("excel.present")
local OpenActExcel = require("excel.openAct")
local MailExcel = require("excel.mail")
local Msg = require("core.Msg")
local ObjHuman = require("core.ObjHuman")
local MailManager = require("mail.MailManager")
local BagLogic = require("bag.BagLogic")
local Grid = require("bag.Grid")
local KingWorldLogic = require("present.KingWorldLogic")
local YunYingLogic = require("yunying.YunYingLogic")
local PanelDefine = require("broadcast.PanelDefine")
local SevenDayGiftLogic = require("present.SevenDayGiftLogic")
local CommonDB = require("common.CommonDB")
local BuyLogic = require("topup.BuyLogic")
local GuideLogic = require("guide.GuideLogic")

GIFT_STATE_NONE = 0 		-- 不可领取
GIFT_STATE_GET = 1 			-- 可领取
GIFT_STATE_BUY = 2 		    -- 可购买
GIFT_STATE_HADBUY = 3 		-- 已购买

-- 初始db
local function initDB(human)
	human.db.openServerGift = {}
    human.db.openServerGift.free = {}
    human.db.openServerGift.cost = {}
end

local function getDB(human)
	if not human.db.openServerGift then
		initDB(human)
	end
	return human.db.openServerGift
end

-- 免费礼包状态
function getFreeState(human, day)
	if not human.db.openServerGift then
		return
	end
	local data = human.db.openServerGift
    return data.free[day]
end

-- 付费礼包状态
function getCostState(human, day)
	if not human.db.openServerGift then
		return
	end
	local data = human.db.openServerGift
    local limitCnt = OpenActExcel.openServerGift[day].limitCnt
    if data.cost[day] == nil or data.cost[day] < limitCnt then
        return 
    else
        return 0
    end
end

local function setFreeState(human, day)
	local data = getDB(human)
	data.free[day] = GIFT_STATE_HADBUY
end

local function setCostState(human, day)
	local data = getDB(human)
	data.cost[day] = data.cost[day] or 0
	data.cost[day] = data.cost[day] + 1
end

-- 获取礼包状态
function getGiftState(human, day)
	local freeState = getFreeState(human, day)
	local costState = getCostState(human, day)
    local flag = OpenAct.getOpenActTime(OpenAct.OPEN_ACT_SERVER_GIFT)
    local openDay = CommonDB.getServerOpenDay()
    if flag == nil or openDay == nil or openDay < day then
        return GIFT_STATE_NONE
    end

    if freeState == nil then
        return GIFT_STATE_GET
    elseif costState == nil then
        return GIFT_STATE_BUY
    end
	
	return GIFT_STATE_HADBUY
end

-- 查询
function query(human)
	local msgRet = Msg.gc.GC_PRESENT_OPEN_SERVER_QUERY
	msgRet.list[0] = #OpenActExcel.openServerGift
	for day = 1, msgRet.list[0] do
		local cf = OpenActExcel.openServerGift[day]	
		local net = msgRet.list[day]
		net.day = day
		net.state = getGiftState(human, day)
        local itemConfig = nil
        net.nowCnt = 0
        net.limitCnt = 0
        if net.state == GIFT_STATE_BUY then
            itemConfig = cf.freeGift
            --itemConfig = cf.costGift
            net.nowCnt = human.db.openServerGift.cost[day] or 0
            net.limitCnt = cf.limitCnt
        else
            itemConfig = cf.freeGift
        end

		net.item[0] = #itemConfig
		for j = 1, net.item[0] do
			local itemID = itemConfig[j][1]
			local itemCnt = itemConfig[j][2]
			Grid.makeItem(net.item[j], itemID, itemCnt)
		end
        net.buyItem[0] = 0
        --BuyLogic.fontBuyItem(human, net.buyItem, cf.buyID)
	end

	Msg.send(msgRet, human.fd)
end

-- 领取奖励
function gift(human, day)
	local cf = OpenActExcel.openServerGift[day]	
	if not cf then 
		return Broadcast.sendErr(human, Lang.ITEM_BUY_ERROR)
	end

	local state = getGiftState(human, day)
	if state ~= GIFT_STATE_GET then
		if state == GIFT_STATE_NONE then
			return Broadcast.sendErr(human, Lang.PRESENT_SEVENLOGINDAY_GET_DAYERR)
		end
		return Broadcast.sendErr(human, Lang.YUNYING_GET_ERR_HADGET)
	end

	setFreeState(human, day)
	--发放物品
    local itemConfig = OpenActExcel.openServerGift[day].freeGift

    local len = #itemConfig
    for i = 1,len do
        local itemID = itemConfig[i][1]
        local itemCnt = itemConfig[i][2]
        BagLogic.addItem(human,itemID,itemCnt,"open_server_gift")
    end

	BagLogic.sendItemGetList(human, itemConfig, "open_server_gift")
	for k, v in pairs(funcID) do
	    YunYingLogic.updateIcon(YYInfo[k], human)
	    YunYingLogic.sendGroupUpdate(YYInfo[k], human, PanelDefine.PANEL_ID_3602)
        break
    end
	if day == 2 then
        KingWorldLogic.setState(human,2)
    end
    GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_OPEN_SERVER_GIFT)
	query(human)
end

-- 红点
function isRed(human)
    for day in ipairs(OpenActExcel.openServerGift) do
		local state = getGiftState(human, day)	
		if state == GIFT_STATE_NONE then
			break
		end
		if state == GIFT_STATE_GET then
			return true
		end
    end	
end

function buyGift(human,day)
    -- 校验状态是否为能买
    local state = getGiftState(human, day)	
    if state ~= GIFT_STATE_BUY then
        return
    end

    -- 设置购买数量
    setCostState(human,day)

    -- 发放道具
    local itemConfig = OpenActExcel.openServerGift[day].costGift

    local len = #itemConfig
    for i = 1,len do
        local itemID = itemConfig[i][1]
        local itemCnt = itemConfig[i][2]
        BagLogic.addItem(human,itemID,itemCnt,"open_server_gift")
    end
    BagLogic.sendItemGetList(human, itemConfig, "open_server_gift")
    query(human)
end

function isBaseOpen(human,noSend)
	local openLv = YunYingLogic.getOpenLvByPanelID(PanelDefine.PANEL_ID_3602)
    if human.db.lv < openLv then
        if not noSend then
            local str = Util.format(Lang.ROLE_LEV_ERROR,openLv)
            return Broadcast.sendErr(human,str)
        end
    end
    local flag = OpenAct.getOpenActTime(OpenAct.OPEN_ACT_SERVER_GIFT)
    if not flag then
		return
	end

    return true
end

function isOpen(human)
	if isBaseOpen(human,true) then
		return true
	end
end

function getLeftTime()
    local openDay = CommonDB.getServerOpenDay()
   if openDay == nil then
	  return 0
   end

   local OpenActConfig = OpenActExcel.openAct[1]
   if not OpenActConfig then return 0 end

   local sDay = OpenActConfig.sDay;
   local eDay = OpenActConfig.eDay;

   if openDay >= sDay and openDay <= eDay then
      local time = os.time();
   	  local openTime = CommonDB.getServerOpenTime()
      if openTime == 0 then
		 return 0
	  end

      local endTime = Util.getDayStartTime(openTime) + eDay * 86400
      return endTime - time
   end

   return 0
end